<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>find和findIndex</title>
</head>
<body>
  <script>
    /**
     * 数组实例的find方法，用于找出第一个符合条件的数组成员，它的参数是一个回调函数，
     * 所有数组成员依次执行该回调函数，知道找出第一个返回值为true的成员，
     * 然后返回该成员。如果没有符合条件的成员，则返回undefined
     *
    */
  //  var a = [1,4,-5,10].find((n) => n < 0) // -5
  //  console.log(a)

   var b = [1, 5, 10, 15].find(function(value, index, arr) {
    return value > 9;
  }) //
  console.log(b) // 10

  // [1, 5, 10, 15].find(function(value, index, arr) {
  //   return value > 9;
  // })
  // // 等同于
  // [1,5,10,15].find((value,index,arr) => value > 9) // 10
  // //上面代码中find方法的回调函数可以接受三个参数，依次了当前的值，当前的位置，和原数组

  // findIndex方法的用法与find方法非常类似，返回第一个符合条件的数组成员的位置，如果所有成员都不符合，返回 -1
  var d = [1,5,10,15].findIndex((value, index, arr) => value > 9) // 2
  // 这俩种方法都可以接受第二个参数，用来绑定回调函数的this对象
  function f(v) {
    return v > this.age
  }
  let person = {name: 'John', age: 20}
  const res = [10,12,26,15].find(f, person)
  console.log(res) // 26
  // 上面代码中，find函数接收了第二个参数person对象，回调函数中的this对象指向person对象。
  // 另外，这俩个方法都可以发现NaN，弥补了数组的indexof方法的不足
  var e = [NaN,1].indexOf(NaN)
  console.log(e) //-1 表明indexOf无法发现NaN
  var arr = [NaN, 1]
  var f = arr.find((n) => n + '' === 'NaN') // find能找到NaN
  console.log(f)
   f === arr[0] ? console.log('11111') : console.log('2222')
   [NaN, 1].findIndex(y => Object.is(NaN, y))//0
   // findIndex可以借助Object.is方法做到

  //
  // </script>
  // <script>
  //  [1,4,-5,10].find((n) => n < 0)
  // </script>
</body>
</html>